// 击鼓传花
// 游戏规则：需要游戏参与者围成一个圈，并按固定的顺序传递给旁边的人，某一时刻传花结束，此时花在谁手里，谁就退出圆圈，结束游戏，重复这个过程，直到只剩最后一个孩子即为胜利者。
class Queue {
    constructor () {
      this.count = 0
      this.lowestCount = 0
      this.items = {}
    }
    size () {
      return this.count - this.lowestCount
    }
    isEmpty () {
      return this.size() === 0
    }
    enqueue (element) {
      this.items[this.count] = element
      this.count++
    }
    dequeue () {
      if (this.isEmpty()) {
        return undefined
      }
      const result = this.items[this.lowestCount]
      delete this.items[this.lowestCount]
      this.lowestCount++
      return result
    }
    peek () {
      if (this.isEmpty()) {
        return undefined
      }
      return this.items[this.lowestCount]
    }
    clear () {
      this.count = 0
      this.lowestCount = 0
      this.items = {}
    }
    toString () {
      if (this.isEmpty()) {
        return ''
      }
      let objStr = this.items[this.lowestCount]
      for(let i = this.lowestCount + 1; i < this.count; i++) {
        objStr = `${objStr},${this.items[i]}`
      }
      return objStr
    }
}
// import { Queue } from './3-1使用对象实现JS队列.mjs'

function hotPotato (elementList, num) {
    const queue = new Queue()
    const eliminatedList = []
    for (let i = 0; i < elementList.length; i++) {
      queue.enqueue(elementList[i])
    }
    while (queue.size() > 1) {
      for (let i = 0; i < num; i++) {
        queue.enqueue(queue.dequeue())
      }
      eliminatedList.push(queue.dequeue())
    }
    return {
      eliminated: eliminatedList,
      winner: queue.dequeue()
    }
}

// 代码分析：
// 首先我们使用到了最开始我们创建的队列Queue类。
// 随后我们会得到一份游戏参与者的名单和给定的数字。
// 开始迭代队列，从队列开头移除一个，并同时往队里的末尾添加，来模拟循环游戏的概念。
// 当传递次数等于我们给定的数字时，拿着花的那个人就被淘汰，移除队列并同时添加到淘汰数组中。
// 一直进行以上的操作，直到队列中只有一个人时，结束循环。
// 在撰写完以上的代码后，我们实际写一个例子来验证：
const names = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE']
const result = hotPotato(names, 7)
for (let i = 0; i < result.eliminated.length; i++) {
  console.log(`${result.eliminated[i]}在击鼓传花游戏中被淘汰。`)
}
console.log(`胜利者：${result.winner}`)
// CCC在击鼓传花游戏中被淘汰。
// BBB在击鼓传花游戏中被淘汰。
// EEE在击鼓传花游戏中被淘汰。
// DDD在击鼓传花游戏中被淘汰。
// 胜利者：AAA


